// 配置路由的地方
import Vue from "vue"
import VueRouter from "vue-router"
import routes from "./routes"
Vue.use(VueRouter)
// 引入store
import store from "@/store"
// 先把VueRouter原型对象的push，先保存一份
const originPush = VueRouter.prototype.push
const originReplace = VueRouter.prototype.replace

// 第一个参数：告诉原来push方法，你往哪里跳转（传递哪些参数）
// 第二个参数：成功回调
// 第三个参数：失败的回调
// call || apply区别
// 相同点，都可以调用函数一次，都可以篡改函数的上下文一次
// 不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        // 使用call重新指定this，因为以方法的形式调用时，this就是调用方法的那个对象
        originPush.call(this, location, resolve, reject)
    } else {
        originPush.call(
            this,
            location,
            () => {},
            () => {}
        )
    }
}

VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject)
    } else {
        originReplace.call(
            this,
            location,
            () => {},
            () => {}
        )
    }
}

// 配置路由
const router = new VueRouter({
    routes,
    // 滚动行为
    scrollBehavior(to, from, savedPosition) {
        // 返回的这个y=0,代表的是滚动条在最上方
        return { y: 0 }
    },
})

// 全局守卫：前置守卫 路由之间跳转执行
router.beforeEach(async (to, from, next) => {
    // to:获取到你要跳转到哪个路由的信息
    // from:获取到你从哪个路由而来的信息
    // next:放行
    // 用户登录才会有token,未登录一定不会有token
    let token = store.state.user.token
    // 用户信息
    let name = store.state.user.userInfo.name
    // 用户已经登录了
    if (token) {
        // 阻止用户前往login
        if (to.path == "/login" || to.path == "/register") {
            next("/home")
        } else {
            // 已经登陆成功，去的不是login
            // 用户名已有
            if (name) {
                next()
            } else {
                // 登录了，没有用户信息
                // 派发action，获取用户信息
                try {
                    // 获取用户信息成功
                    await store.dispatch("user/getUserInfo")
                    next()
                } catch (error) {
                    // token已经失效了 获取不到用户的信息
                    // 清除token
                    await store.dispatch("user/userLogout")
                    next("/login")
                }
            }
        }
    } else {
        // 未登录 不能去交易相关、支付相关的页面(pay/paySuccess)、不能去个人中心
        // 未登录去上面这些路由跳转到登录
        let toPath = to.path
        if (
            toPath.indexOf("/trade") != -1 ||
            toPath.indexOf("/pay") != -1 ||
            toPath.indexOf("/center") != -1
        ) {
            // 把未登录的时候想去而没有去成的信息,存储于地址栏中
            next("/login?redirect=" + toPath)
        } else {
            // 去的不是上面这些路由放行放行 home search shopCart
            next()
        }
    }
})
export default router
